home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Forever 4
/
Atari Forever 4.zip
/
Atari Forever 4.iso
/
FALCON
/
BIGDISKS
/
BIG_05
/
TRICKFIL.M
/
TRICKFLM.LST
< prev
next >
Wrap
File List
|
1998-03-14
|
30KB
|
962 lines
' *****************************************************************************
'
' Programm zum Herstellen von kleinen Zeichentrickfilmen
'
' von Heiko Müller, Mozartstraße 17, 2905 Edewecht
'
datum$="18.06.1988" ! letztes Bearbeitungsdatum
'
' *****************************************************************************
'
ON ERROR GOSUB fehler ! falls es den Ordner "FILME" schon gibt, entsteht
' ! in der nächsten Zeile ein Fehler:
MKDIR "FILME" ! diese ersten Zeilen vor dem Compilieren löschen
GOSUB speicher_einrichten
GOSUB ueberschrift
GOSUB titelbild
'
' #############################################################################
'
DO ! Hauptprogrammschleife
'
i$=INKEY$ ! Tastaturabfrage
IF i$<>""
l=LEN(i$)
a=ASC(RIGHT$(i$))
GOSUB wat_nu_taste ! für Tastaturauswertung
ENDIF
'
MOUSE x%,y%,k%
IF k%
IF (x%>270 AND x%<520) AND y%>200 AND y%<350 AND NOT block!
GET 271,201,519,349,undo$ ! Bild merken für Undo-Funktion
GOSUB freihand ! Freihand als Grundfunktion
ELSE
GOSUB wat_nu ! für Mausaktionenauswertung
ENDIF
ENDIF
LOOP
'
' #############################################################################
'
PROCEDURE fehler ! läuft nicht im compilierten Programm!
IF ERR=-36 ! wenn der einzurichtende Ordner "FILME" schon
RESUME NEXT ! besteht, soll in der Zeile hinter dem Befehl
ENDIF ! "MKDIR" weitergemacht werden.
RETURN
'
PROCEDURE wat_nu ! hier werden die Mausaktionen ausgewertet
'
REPEAT ! erst dann weitermachen, wenn Maustaste
UNTIL MOUSEK=0 ! losgelassen wird
'
IF y%>110
GET 271,201,519,349,undo$ ! Bild merken für Undo-Funktion
ENDIF
'
IF y%<50 AND NOT block! ! große Schrift oben angeklickt
GOSUB ueberschrift
GOSUB reparatur
ENDIF
'
IF x%>20 AND x%<620 AND y%>50 AND y%<170 ! 12 große Kästen angeklickt
z=INT((x%-20)/100)+1+INT((y%-50)/60)*6
IF NOT block!
ON z GOSUB spei,lad,abspi,must_wa,lin_wa,fig_fuell,fuell,block,kreis,ellipse,gerade,kasten
ELSE
IF z=8
GOSUB block
ENDIF
ENDIF
'
ENDIF
'
IF x%>20 AND y%>360 AND x%<130 AND y%<380 ! Programmende-Kasten
GOSUB ende
ENDIF
'
IF x%>270 AND x%<362 AND y%>360 AND y%<380 ! Kästen unter rechtem Bild
z=INT((x%-270)/24)+1
IF NOT block!
ON z GOSUB hoch,runter,rechts,links
ELSE
b=1
IF k%=2
b=5
ENDIF
DEFFILL 0,2,8
PBOX a1%,b1%,a2%,b2%
ON z GOSUB b_hoch,b_runter,b_rechts,b_links
PUT a1%,b1%,block$
GET 271,201,519,349,bild$(bild%)
'
IF a1%<270 OR b1%<200 OR a2%>520 OR b2%>350 ! falls Umgebung durch Block
IF a1%<270 ! überdeckt ist
a1%=270
ENDIF
IF b1%<200
b1%=200
ENDIF
IF a2%>520
a2%=520
ENDIF
IF b2%>350
b2%=350
ENDIF
GOSUB reparatur
GET a1%,b1%,a2%,b2%,block$
GOSUB kasten_schwarz(8)
ENDIF
'
PAUSE 5
ENDIF
ENDIF
'
IF x%>540 AND x%<620 AND y%>200 AND y%<380 ! Kasten rechts neben Bildern
z=INT((y%-200)/20)+1
IF NOT block!
ON z GOSUB zurueck,vor,merken,einsetzen,loeschen,entfernen,erweitern,alles_weg,zu_bild
IF z<3
GET 271,201,519,349,undo$ ! falls vor oder zurück: neues Bild merken
ENDIF
IF z>5 ! nach entfernen, erweitern, Film löschen, zu Bild...
undo$="" ! kein Undo mehr möglich
ENDIF
ELSE
ON z GOSUB nicht,nicht,b_merken,hier_nicht,b_loeschen,nicht,nicht,nicht,nicht
ENDIF
ENDIF
'
IF x%>405 AND y%>360 AND x%<460 AND y%<380
GOSUB kopieren
ENDIF
'
RETURN
'
'
PROCEDURE nicht
OUT 2,7
RETURN
'
PROCEDURE hier_nicht
ALERT 0,"Das geht erst, wenn die|Blockfunktion wieder|ausgeschaltet ist.",1,"ach so",antw
RETURN
'
PROCEDURE wat_nu_taste
'
' Diese Procedure wird in diesem Programm nur für die Undo-Taste genutzt.
' Es ist möglich, hier noch andere Unterprogrammaufrufe zu installieren,
' die per Tastendruck ausgelöst werden.
' Dazu werden bei Tastendruck die beiden Variablen a und l belegt,
' die man sich durch die folgende Programmzeile zur weiteren Bearbeitung
' anzeigen lassen kann:
'
' TEXT 20,190," Taste "+i$+" "+STR$(a)+" "+STR$(l)+" " ! (später löschen)
'
IF a=97 AND l=2 ! Wenn die Undo-Taste getippt wurde
PUT 271,201,undo$
ENDIF
RETURN
'
PROCEDURE ueberschrift
CLS
DEFTEXT 1,16,0,32
TEXT 10,50,"# Zeichentrickfilmprogramm ##"
DEFTEXT 1,0,0,4
TEXT 550,30,"Version "+version$
TEXT 550,40,"vom"
TEXT 550,50,datum$
TEXT 440,380,"Leertaste: weitere Informationen"
TEXT 440,390,"rechte Maustaste: Hauptprogramm"
PRINT AT(3,5);
PRINT "programmiert in GFA-BASIC von Heiko Müller, Mozartstraße 17, 2905 Edewecht"
PRINT
PRINT " Als Grundfunktion ist das Freihand-Malen eingebaut. Nur das rechte Bild"
PRINT " kann bearbeitet werden. Mit der rechten Maustaste läßt sich in der"
PRINT " eingestellten Strichstärke radieren."
PRINT " Mit den vier Pfeilfeldern unter dem rechten Bild wird der Bildinhalt"
PRINT " verschoben - mit der linken Maustaste um ein Pixel, mit der rechten um"
PRINT " fünf."
PRINT " Mit dem Feld rechts daneben wird das linke (das vorhergehende) Bild auf"
PRINT " das bearbeitete Bild kopiert."
PRINT " Mit der Funktion >>merken<< wird der momentane Bildinhalt gespeichert zum"
PRINT " späteren >>einsetzen<< in ein anderes Bild."
PRINT " Mit der Taste 'Undo' kann man nach Beendigung der meisten Funktionen die"
PRINT " letzten Veränderungen rückgängig machen."
PRINT " Jedes Bild wird automatisch gespeichert, wenn man zu einem anderen Bild"
PRINT " vorwärts oder rückwärts geht."
PRINT " Aktionen, bei denen das Bild oder Teile des Bildes gelöscht werden,"
PRINT " können nur mit der rechten Maustaste ausgelöst werden."
PRINT
PRINT " Zum Speichern muß (!) der Ordner FILME existieren!"
'
REPEAT
i$=INKEY$
UNTIL MOUSEK=2 OR i$=" "
IF i$=" "
GOSUB weitere_infos
ENDIF
DEFTEXT 1,0,0,13
CLS
RETURN
'
PROCEDURE weitere_infos
CLS
PAUSE 30
PRINT AT(3,2);
PRINT "Dieses Programm darf mitsamt dem Quellcode beliebig oft kopiert und"
PRINT " weitergegeben werden. Ich selbst habe mich auch oft über andere GfA-PD-"
PRINT " Programme gefreut und daraus auch gerne Teile übernommen."
PRINT
PRINT " Da ich wohl Freude am Programmieren habe, jedoch nicht am Herstellen von"
PRINT " Zeichentrickfilmen, habe ich als Beispiel nur den 'Pferdefilm' übernom-"
PRINT " men, den man auf der Original-BASIC-Diskette findet. Falls jemand das"
PRINT " Programm so gut findet, daß er mir auch einen Gefallen tun möchte, so"
PRINT " kann er mir ja mal eine Diskette mit eigenen Filmen schicken. Auch andere"
PRINT " 'selbstgestrickte' GfA-BASIC-Programme nehme ich natürlich gerne an."
PRINT
PRINT " Heiko Müller"
PRINT " Mozartstraße 17"
PRINT " 2905 Edewecht"
DEFTEXT 1,0,0,4
TEXT 440,380,"Leertaste oder Mausklick"
REPEAT
i$=INKEY$
UNTIL MOUSEK OR i$=" "
DEFTEXT 1,0,0,13
CLS
RETURN
'
PROCEDURE freihand ! Diese Procedure wird als Grundfunktion
DEFLINE 1,breite,2,2 ! immer angesteuert
COLOR 1
IF k%>1
COLOR 0
ENDIF
PLOT x%,y%
IF merk%=bild%
text$=" Altes Bild "+STR$(bild%)+" gemerkt"
ENDIF
WHILE (x%>270 AND x%<520) AND y%>200 AND y%<350 AND MOUSEK>0
DRAW TO x%,y%
MOUSE x%,y%,k%
WEND
COLOR 1
GET 271,201,519,349,bild$(bild%)
RETURN
'
PROCEDURE spei
GET 271,201,519,349,bild$(bild%)
GOSUB kasten_schwarz(1)
frei=INT(DFREE(0)/1024) ! freien Platz auf der Diskette ermitteln
groesse=0
FOR i%=0 TO schluss ! Filmlänge ermitteln
groesse=groesse+LEN(bild$(i%))
NEXT i%
groesse=INT(groesse/1024+1)
al$="Filmlänge: "+STR$(groesse)+" KByte |"
al$=al$+"freier Platz auf der Diskette:|"+SPACE$(11)+STR$(frei)+" KByte"
ALERT 0,al$,1," aha ",antw
IF frei<groesse
ALERT 3,"Nicht genug Platz| auf der Diskette!| |Soll etwas gelöscht werden?",1,"Abbruch|löschen",antw
IF antw=2
FILESELECT "A:\FILME\*.*","",name$
IF LEN(name$)>0
ALERT 3," Die Datei | "+name$+"| löschen ?",1,"Nein| Ja ",antw
IF antw=2
KILL name$
ENDIF
ENDIF
ENDIF
ENDIF
IF frei>groesse
IF bild$(endbild%)=bild$(0) ! leeres Bild am Ende löschen
bild$(endbild%)=""
DEC endbild%
ENDIF
FILESELECT "A:\FILME\*.FLM","",name$
IF LEN(name$)>0
PUT 21,201,bild$(0)
IF INSTR(name$,".")=0 ! falls im Namen kein Punkt vorkommt,
name$=name$+".FLM" ! FLM dranhängen
ENDIF
OPEN "O",#1,name$
DEFMOUSE 2
'
' die folgende Routine stammt aus dem Buch "GFA BASIC" von F. Ostrowski,
' ebenso wie die dazugehörige Laderoutine in der nächsten Procedure
'
FOR i%=0 TO schluss
PRINT #1,MKI$(LEN(bild$(i%)));bild$(i%);
IF bild$(i%)<>""
TEXT 270,195," Bild "+STR$(i%)+" "
PUT 271,201,bild$(i%)
ENDIF
NEXT i%
CLOSE #1
ENDIF
ENDIF
bild%=1
GOSUB reparatur
RETURN
'
PROCEDURE lad
GOSUB kasten_schwarz(z)
FILESELECT "A:\FILME\*.FLM","",name$
IF EXIST(name$) ! Datei existiert?
OPEN "I",#1,name$
FOR i%=0 TO schluss
bild$(i%)=INPUT$(CVI(INPUT$(2,#1)),#1)
IF bild$(i%)<>"" ! durch Hochzählen der vollen Bilder
endbild%=i% ! Gesamtbildzahl ermitteln
TEXT 270,195," Bild "+STR$(i%)+" "
PUT 271,201,bild$(i%) ! geladene Bilder gleich anzeigen
ENDIF
NEXT i%
bild%=1
ENDIF
CLOSE #1
GOSUB reparatur
RETURN
'
PROCEDURE abspi
GOSUB kasten_schwarz(z)
IF bild$(endbild%)=bild$(0) ! leeres Bild am Ende löschen
bild$(endbild%)=""
DEC endbild%
ENDIF
ALERT 0," Film abspielen | | In welche Richtung? | ",2," ⇨ | ⇨ ⇦ | ⇦ ",antw
DEFFILL 1,2,8
p=0
PBOX 0,0,639,399
TEXT 0,395," linke Maustaste: schneller * rechts: langsamer * beide: Stop * Tempo "+STR$(20-p)+" "
HIDEM
REPEAT
IF antw<3
FOR i%=1 TO endbild% ! Vorwärtsvorführung
PUT 195,100,bild$(i%)
PAUSE p
MOUSE x%,y%,k%
IF k%
GOSUB tempo
ENDIF
EXIT IF MOUSEK>2
NEXT i%
ENDIF
EX MODE 1
GET 271,201,519,349,bild$(bild%)
GOSUB reparatur
undo$=block_undo$
ENDIF
IF linksblock!
GOSUB linksblock
ENDIF
RETURN
'
PROCEDURE linksblock
REPEAT
MOUSE x%,y%,k%
UNTIL k% AND ((x%>120 AND x%<220 AND y%>110 AND y%<170) OR (x%>405 AND x%<460 AND y%>360 AND y%<380))
IF (x%>120 AND x%<220 AND y%>110 AND y%<170)
ENDIF
IF x%>405 AND y%>360 AND x%<460 AND y%<380
GET a1%+1,b1%+1,a2%-1,b2%-1,block$
PUT a1%+251,b1%,block$
ENDIF
linksblock!=FALSE
z=8
GOSUB block
REPEAT
UNTIL MOUSEK=0
RETURN
'
PROCEDURE kreis
GOSUB kasten_schwarz(9)
DEFMOUSE 7
DEFLINE 1,1,0,0
TEXT 270,195,"Ende der Funktion durch rechte Maustaste "
DO
MOUSE x%,y%,k%
EXIT IF k%>1
IF x%>520 AND x%<620 AND y%>50 AND y%<110 AND k%=1
GOSUB fig_fuell
ENDIF
IF k%=1
IF merk%=bild%
text$=" Altes Bild "+STR$(bild%)+" gemerkt"
ENDIF
DEFLINE 1,1,0,0
REPEAT
MOUSE x%,y%,k%
UNTIL k%=1
GRAPHMODE 3
PAUSE 10
REPEAT
MOUSE x1%,y1%,k%
radius=ABS(x1%-x%)
CIRCLE x%,y%,radius
PAUSE 2
CIRCLE x%,y%,radius
UNTIL k%<>1
GRAPHMODE 1
DEFLINE 1,breite,2,2
DEFFILL 1,muster1,muster2
IF figurfuellen!
PCIRCLE x%,y%,ABS(x1%-x%)
ELSE
CIRCLE x%,y%,ABS(x1%-x%)
ENDIF
PAUSE 5
ENDIF
LOOP
GET 271,201,519,349,bild$(bild%)
DEFMOUSE 0
TEXT 270,195,SPACE$(45)
GOSUB reparatur
REPEAT
UNTIL MOUSEK=0
RETURN
'
PROCEDURE ellipse
GOSUB kasten_schwarz(10)
DEFMOUSE 7
TEXT 270,195,"Ende der Funktion durch rechte Maustaste "
DO
MOUSE x%,y%,k%
EXIT IF k%>1
IF x%>520 AND x%<620 AND y%>50 AND y%<110 AND k%=1
GOSUB fig_fuell
ENDIF
IF k%=1
IF merk%=bild%
text$=" Altes Bild "+STR$(bild%)+" gemerkt"
ENDIF
DEFLINE 1,1,0,0
REPEAT
MOUSE x%,y%,k%
UNTIL k%=1
GRAPHMODE 3
PAUSE 10
REPEAT
MOUSE x1%,y1%,k%
ELLIPSE x%,y%,ABS(x1%-x%),ABS(y1%-y%)
PAUSE 2
ELLIPSE x%,y%,ABS(x1%-x%),ABS(y1%-y%)
UNTIL k%<>1
GRAPHMODE 1
DEFLINE 1,breite,2,2
DEFFILL 1,muster1,muster2
IF figurfuellen!
PELLIPSE x%,y%,ABS(x1%-x%),ABS(y1%-y%)
ELSE
ELLIPSE x%,y%,ABS(x1%-x%),ABS(y1%-y%)
ENDIF
PAUSE 5
ENDIF
LOOP
GET 271,201,519,349,bild$(bild%)
DEFMOUSE 0
TEXT 270,195,SPACE$(45)
GOSUB reparatur
REPEAT
UNTIL MOUSEK=0
RETURN
'
PROCEDURE gerade
GOSUB kasten_schwarz(11)
DEFMOUSE 5
DEFLINE 1,1,0,0
TEXT 270,195,"Ende der Funktion durch rechte Maustaste "
DO
MOUSE x%,y%,k%
EXIT IF k%>1
IF x%>270 AND x%<520 AND y%>200 AND y%<350 AND k%=1
IF merk%=bild%
text$=" Altes Bild "+STR$(bild%)+" gemerkt"
ENDIF
DEFLINE 1,1,0,0
GRAPHMODE 3
PAUSE 10
REPEAT
MOUSE x1%,y1%,k%
IF x1%<270
x1%=270
ENDIF
IF x1%>520
x1%=520
ENDIF
IF y1%>350
y1%=350
ENDIF
IF y1%<200
y1%=200
ENDIF
LINE x%,y%,x1%,y1%
PAUSE 2
LINE x%,y%,x1%,y1%
UNTIL k%<>1
GRAPHMODE 1
DEFLINE 1,breite,2,2
LINE x%,y%,x1%,y1%
PAUSE 5
ENDIF
LOOP
GET 271,201,519,349,bild$(bild%)
TEXT 270,195,SPACE$(45)
GOSUB reparatur
REPEAT
UNTIL MOUSEK=0
RETURN
'
'
PROCEDURE kasten
GOSUB kasten_schwarz(12)
DEFMOUSE 5
DEFLINE 1,1,0,0
TEXT 270,195,"Ende der Funktion durch rechte Maustaste "
DO
MOUSE x%,y%,k%
EXIT IF k%>1
IF x%>520 AND x%<620 AND y%>50 AND y%<110 AND k%=1
GOSUB fig_fuell
ENDIF
IF x%>20 AND x%<520 AND y%>200 AND y%<350 AND k%=1
IF merk%=bild%
text$=" Altes Bild "+STR$(bild%)+" gemerkt"
ENDIF
GOSUB gummikasten
GRAPHMODE 1
DEFLINE 1,breite,2,2
DEFFILL 1,muster1,muster2
IF figurfuellen!
PBOX x%,y%,x1%,y1%
ELSE
BOX x%,y%,x1%,y1%
ENDIF
PAUSE 5
ENDIF
LOOP
GET 271,201,519,349,bild$(bild%)
TEXT 270,195,SPACE$(45)
GOSUB reparatur
REPEAT
UNTIL MOUSEK=0
RETURN
'
PROCEDURE gummikasten
DEFLINE 1,1,0,0
REPEAT
MOUSE x%,y%,k%
UNTIL k% AND x%>20 AND x%<520 AND y%>200 AND y%<350
GRAPHMODE 3
PAUSE 10
REPEAT
MOUSE x1%,y1%,k%
IF x1%<20
x1%=20
ENDIF
IF x1%>520
x1%=520
ENDIF
IF y1%>350
y1%=350
ENDIF
IF y1%<200
y1%=200
ENDIF
BOX x%,y%,x1%,y1%
PAUSE 2
BOX x%,y%,x1%,y1%
UNTIL k%<>1
IF x1%<x%
SWAP x1%,x%
ENDIF
IF y1%<y%
SWAP y1%,y%
ENDIF
RETURN
'
PROCEDURE kasten_schwarz(z)
IF z>6
y%=110
SUB z,6
ELSE
y%=50
ENDIF
x%=100*z-80
GRAPHMODE 3
DEFFILL 1,2,8
PBOX x%,y%,x%+100,y%+60
GRAPHMODE 1
RETURN
'
PROCEDURE merken
GET 271,201,519,349,merk$
merk%=bild%
text$=" Bild "+STR$(bild%)+" gemerkt "
TEXT 430,195,text$
block_gemerkt!=FALSE
RETURN
'
PROCEDURE einsetzen
IF merk$=""
ALERT 0,"Es ist kein Bild gemerkt!",1,"ach so",antw
ELSE
IF block_gemerkt!
GOSUB b_einsetzen
ELSE
GET 271,201,519,349,bild$(bild%) ! zum Untersuchen, ob Bild leer ist
REPEAT
UNTIL MOUSEK=0
IF bild$(bild%)<>bild$(0) AND k%=2
PUT 271,201,merk$
ENDIF
IF bild$(bild%)=bild$(0)
PUT 271,201,merk$
ENDIF
ENDIF
ENDIF
GET 271,201,519,349,bild$(bild%)
RETURN
'
PROCEDURE zurueck
IF bild%>1
GET 271,201,519,349,bild$(bild%)
DEC bild%
ENDIF
'
GOSUB reparatur
'
PAUSE 5
RETURN
'
PROCEDURE vor
GET 271,201,519,349,bild$(bild%)
IF bild%<schluss AND bild$(bild%)<>bild$(0)
INC bild% ! Bild weiterzählen
IF bild$(bild%)="" ! falls neues Bild nichts enthält:
INC endbild% ! Endbildnummer erhöhen
bild$(bild%)=bild$(0) ! Leerbild auf neues Bild
IF bild%=schluss
REPEAT
UNTIL MOUSEK=0
ALERT 0,"Das ist das letzte Bild",1," na ja ",antw
ENDIF
ENDIF
'
GOSUB reparatur
'
ENDIF
PAUSE 5
RETURN
'
PROCEDURE loeschen
IF k%=2
bild$(bild%)=bild$(0)
PUT 271,201,bild$(0)
ENDIF
RETURN
'
PROCEDURE entfernen ! hier wird ein Bild ganz gelöscht,
IF k%=2 ! indem die folgenden Bilder
FOR i%=bild% TO endbild% ! um ein Bild vorrücken
bild$(i%)=bild$(i%+1)
NEXT i%
IF endbild%=bild% AND bild%>1
DEC bild%
ENDIF
IF endbild%>1
DEC endbild%
ENDIF
REPEAT
UNTIL MOUSEK=0
GOSUB reparatur
ENDIF
RETURN
'
PROCEDURE erweitern ! hier wird ein leeres Bild zwischengefügt
IF bild$(bild%)<>bild$(0) ! indem die folgenden Bilder um ein Bild
INC endbild% ! nach hinten rücken
FOR i%=endbild% DOWNTO bild%
bild$(i%)=bild$(i%-1)
NEXT i%
IF endbild%>schluss
bild$(endbild%)=""
DEC endbild%
ENDIF
bild$(bild%)=bild$(0)
GOSUB reparatur
ENDIF
RETURN
'
PROCEDURE alles_weg
ALERT 0,"Den ganzen Film löschen? ",2," ja | nein ",antw
IF antw=1
FOR i%=1 TO schluss
bild$(i%)=""
NEXT i%
bild$(1)=bild$(0)
bild%=1
endbild%=1
PUT 21,201,bild$(0)
PUT 271,201,bild$(1)
TEXT 270,195," Bild "+STR$(bild%)+" (von "+STR$(endbild%)+") "
ENDIF
RETURN
'
'
FOR i%=200 TO 360 STEP 20 ! Kästen rechts neben Bildern
BOX 540,i%,620,i%+20
NEXT i%
'
PROCEDURE zu_bild ! zu eingegebenem Bild gehen
GET 271,201,519,349,bild$(bild%)
DEFFILL 1,2,1
PBOX 540,360,635,390
HIDEM
PRINT AT(69,24);"zu Bild:";
FORM INPUT 3,i$
bild%=VAL(i$)
IF bild%>endbild%
bild%=endbild%
ENDIF
IF bild%<1
bild%=1
ENDIF
SHOWM
GOSUB reparatur
RETURN
'
PROCEDURE kopieren
IF NOT block!
GET 271,201,519,349,bild$(bild%)
antw=0
IF (bild$(bild%)<>bild$(0) AND k%=2) OR (bild$(bild%)=bild$(0))
PUT 271,201,bild$(bild%-1)
ENDIF
ENDIF
RETURN
'
PROCEDURE hoch
IF k%=1
GET 271,202,519,349,schieb$
ELSE
GET 271,206,519,349,schieb$
ENDIF
PUT 271,201,bild$(0)
PUT 271,201,schieb$
RETURN
'
PROCEDURE runter
IF k%=1
GET 271,201,519,348,schieb$
ELSE
GET 271,201,519,344,schieb$
ENDIF
PUT 271,201,bild$(0)
PUT 271,202-4*(k%>1),schieb$
RETURN
'
PROCEDURE rechts
IF k%=1
GET 271,201,518,349,schieb$
ELSE
GET 271,201,514,349,schieb$
ENDIF
PUT 271,201,bild$(0)
PUT 272-4*(k%>1),201,schieb$
RETURN
'
PROCEDURE links
IF k%=1
GET 272,201,519,349,schieb$
ELSE
GET 276,201,519,349,schieb$
ENDIF
PUT 271,201,bild$(0)
PUT 271,201,schieb$
RETURN
'
PROCEDURE speicher_einrichten
schluss=100 ! letzter Bildspeicher
DIM bild$(schluss+1) ! Bildspeicher
bild%=1 ! Nummer des bearbeiteten Bildes
endbild%=1 ! höchste Bildnummer
'
breite=1 ! Strichstärke
muster1=2 ! Angaben für DEFFILL
muster2=4 ! " " "
block!=FALSE ! Flag zur Markierung, ob Blockoperation
'
DEFFILL 1,muster1,muster2 ! vorgegebenes Füllmuster: grau
RETURN
'
PROCEDURE titelbild
'
DEFTEXT 1,16,0,32
TEXT 20,40,"# Zeichentrickfilmprogramm #######"
DEFTEXT 1,0,0,13
'
BOX 20,200,270,350 ! Kästen für Filmbilder
BOX 270,200,520,350
GET 21,201,269,349,bild$(0) ! leeres Bild
bild$(1)=bild$(0)
'
TEXT 25,75," Film Film Film Füllmuster Liniendicke Figuren "
TEXT 25,95," speichern laden abspielen auswählen (1) ausfüllen"
TEXT 25,135," ausfüllen Block Kreis Ellipse Gerade Kasten"
'
FOR i%=20 TO 520 STEP 100 ! obere Kastenreihe
BOX i%,50,i%+100,110
NEXT i%
'
FOR i%=20 TO 520 STEP 100 ! zweite Kastenreihe
BOX i%,110,i%+100,170
NEXT i%
'
FOR i%=200 TO 360 STEP 20 ! Kästen rechts neben Bildern
BOX 540,i%,620,i%+20
NEXT i%
'
TEXT 545,215,"rückwärts"
TEXT 545,235,"vorwärts"
TEXT 545,255,"merken"
TEXT 545,275,"einsetzen"
TEXT 545,295,"löschen"
TEXT 545,315,"entfernen"
TEXT 545,335,"erweitern"
TEXT 545,355,"alles weg"
TEXT 545,375,"zu Bild.."
'
BOX 20,360,130,380 ! Kasten unten links
TEXT 25,375,"Programmende"
'
TEXT 278,375,"⇧ ⇩ ⇨ ⇦ ⇨"
FOR i%=270 TO 350 STEP 24 ! Kästen unter rechtem Bild
BOX i%,360,i%+24,380
NEXT i%
'
BOX 405,360,460,380
BOX 410,365,425,375
BOX 440,365,455,375
'
SGET titelbild$
TEXT 270,195," Bild "+STR$(bild%)+" (von "+STR$(endbild%)+") "
PBOX 20,140,120,170
'
RETURN
'
PROCEDURE ende
ALERT 2," Soll das Programm | wirklich beendet werden?",2," ja | nein ",antw
IF antw=1
EDIT ! später SYSTEM einsetzen
ENDIF
RETURN
'
PROCEDURE reparatur ! Bild reparieren, falls
SPUT titelbild$ ! das neue Bild den Rand
TEXT 449,95,"("+STR$(breite)+") " ! zerstört hat.
TEXT 430,195,text$
PUT 21,201,bild$(bild%-1)
PUT 271,201,bild$(bild%)
TEXT 270,195," Bild "+STR$(bild%)+" (von "+STR$(endbild%)+") "
TEXT 430,195,text$
DEFFILL 1,muster1,muster2
PBOX 20,140,120,170
DEFMOUSE 0
DEFLINE 1,breite,2,2
figurfuellen!=FALSE
RETURN
'
PROCEDURE b_hoch
SUB b1%,b
SUB b2%,b
IF b2%<200
ADD b1%,b
ADD b2%,b
ENDIF
RETURN
'
PROCEDURE b_runter
ADD b1%,b
ADD b2%,b
IF b1%>350
SUB b1%,b
SUB b2%,b
ENDIF
RETURN
'
PROCEDURE b_rechts
ADD a1%,b
ADD a2%,b
IF a1%>520
SUB a1%,b
SUB a2%,b
ENDIF
RETURN
'
PROCEDURE b_links
SUB a1%,b
SUB a2%,b
IF a2%<270
ADD a1%,b
ADD a2%,b
ENDIF
RETURN
'
PROCEDURE b_merken
GRAPHMODE 3
BOX a1%,b1%,a2%,b2%
GET a1%,b1%,a2%,b2%,merk$
'
DEFFILL 1,2,8 ! gemerkten Block kurz invertieren
PBOX a1%,b1%,a2%,b2%
PAUSE 20
PBOX a1%,b1%,a2%,b2%
DEFFILL 1,muster1,muster2
'
BOX a1%,b1%,a2%,b2%
GRAPHMODE 1
block_gemerkt!=TRUE
text$="Block aus Bild "+STR$(bild%)+" gemerkt"
TEXT 430,195,text$
' GOSUB block
REPEAT
UNTIL MOUSEK=0
RETURN
'
' Die folgende Procedure stammt aus dem Buch "GFA BASIC" von F. Ostrowski
'
PROCEDURE b_einsetzen
DIM bild%(32255/4)
a%=XBIOS(3)
b%=(VARPTR(bild%(0))+255) AND &HFFFF00
SGET bildschirm$
REPEAT
SWAP a%,b%
VOID XBIOS(5,L:a%,L:b%,-1)
SPUT bildschirm$
MOUSE x%,y%,k%
PUT x%,y%,merk$
IF k%=1 ! Block kann beliebig eingesetzt werden.
SGET bildschirm$ ! egal, ob Bildschirmrest überdeckt wird,
ENDIF ! da Reparatur erfolgt
UNTIL k%=2
a%=MAX(a%,b%)
VOID XBIOS(5,L:a%,L:a%,-1)
SPUT bildschirm$
GET 271,201,519,349,bild$(bild%)
ERASE bild%()
GOSUB reparatur
RETURN
'
PROCEDURE b_loeschen
IF k%=2
DEFFILL 0,2,8
PBOX a1%+1,b1%+1,a2%-1,b2%-1
DEFFILL 1,muster1,muster2
z=8
GOSUB block
ENDIF
RETURN